package com.kh.pajx.sop.util.common;

import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

/**
 * 参数验证工具类
 * @author:	azzcsimp
 * @Createdate:	2015年1月8日 下午2:18:13
 */
public class ValidatorUtils {
	
	/**
	 * 验证字符串长度是否符合要求，一个汉字等于三个字符长度(UTF-8,GBK编码下是2个字符长度)
	 * @param value 要验证的字符串
	 * @param limitLength 最大的长度
	 * @return boolean 符合长度true, 超出范围false
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午2:31:41
	 */
	private static boolean validateStrByLength(String value, int maxLength) {
		int temp_int = 0;
		byte[] b = value.getBytes();

		for (int i = 0; i < b.length; i++) {
			if (b[i] >= 0) {
				temp_int = temp_int + 1;
			} else {
				temp_int = temp_int + 2;
				i++;
			}
		}

		if (temp_int > maxLength) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * 验证字符串长度是否符合要求，一个汉字等于三个字符长度(UTF-8,GBK编码下是2个字符长度)
	 * @param value 要验证的字符串
	 * @param limitLength 最大的长度
	 * @param allowNull 是否允许为空，允许true, 不允许false
	 * @return boolean 符合长度true, 超出范围false  
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午2:58:08
	 */
	public static boolean validateStrByLength(String value, int limitLength, boolean allowNull) {
		if(StringUtils.isBlank(value)){
			if(!allowNull){
				return false;
			}
			return true;
		}else{
			return validateStrByLength(value, limitLength);
		}
	}
	
	// ===========================================================================
	
	/**
	 * 验证字符串是否为安全(中文、英文字母、数字)字符串
	 * @param value 待验证的字符串
	 * @return boolean 符合规范true, 不符合false
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午2:35:41
	 */
	private static boolean validateSafeString(String value){
		Pattern pt = Pattern.compile("^[A-Za-z0-9\u4e00-\u9fa5]+$");
		return pt.matcher(value).matches();
	}
	
	/**
	 * 验证字符串是否为安全(中文、英文字母、数字)字符串
	 * @param value 待验证的字符串
	 * @param maxLength 最大长度限制
	 * @return boolean 符合规范true, 不符合false
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午2:36:48
	 */
	private static boolean validateSafeString(String value, int maxLength){
		if(validateStrByLength(value, maxLength)){
			return validateSafeString(value);
		}
		return false;
	}
	
	/**
	 * 验证字符串是否为安全(中文、英文字母、数字)字符串
	 * @param value 待验证的字符串
	 * @param maxLength 最大长度限制
	 * @param allowNull 是否允许为空，允许true, 不允许false
	 * @return boolean 符合规范true, 不符合false
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午2:37:41
	 */
	public static boolean validateSafeString(String value, int maxLength, boolean allowNull){
		if(StringUtils.isBlank(value)){
			if(!allowNull){
				return false;
			}else{
				return true;
			}
		}
		return validateSafeString(value, maxLength);
	}

	/**
	 * 校验字符串格式 中文、英文字母、数字、中文逗号、中文句号
	 * @param value 待验证的字符串
	 * @return   boolean 符合规范true, 不符合false
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午5:22:46
	 */
	private static boolean validateRelativeSafeString(String value){
		Pattern pt = Pattern.compile("^[A-Za-z0-9\u4e00-\u9fa5，。]+$");
		return pt.matcher(value).matches();
	}
	
	public static boolean validateLangIds(String value){
		Pattern pt = Pattern.compile("^[A-Za-z0-9\u4e00-\u9fa5,]+$");
		return pt.matcher(value).matches();
	}
	
	public static boolean validateLangIds(String value, boolean allowNull){
		if(StringUtils.isBlank(value)){
			if(!allowNull){
				return false;
			}else{
				return true;
			}
		}
		return validateLangIds(value);
	}
	
	/**
	 * 校验字符串格式 中文、英文字母、数字、中文逗号、中文句号
	 * @param value 待验证的字符串
	 * @param maxLength 最大长度限制
	 * @return boolean 符合规范true, 不符合false  
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午5:23:22
	 */
	private static boolean validateRelativeSafeString(String value, int maxLength){
		if(validateStrByLength(value, maxLength)){
			return validateRelativeSafeString(value);
		}
		return false;
	}
	
	/**
	 * 校验字符串格式 中文、英文字母、数字、中文逗号、中文句号
	 * @param value 待验证的字符串
	 * @param maxLength 最大长度限制
	 * @param allowNull 是否允许为空，允许true, 不允许false
	 * @return boolean 符合规范true, 不符合false  
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午5:23:24
	 */
	public static boolean validateRelativeSafeString(String value, int maxLength, boolean allowNull){
		if(StringUtils.isBlank(value)){
			if(!allowNull){
				return false;
			}else{
				return true;
			}
		}
		return validateRelativeSafeString(value, maxLength);
	}
	
	
	// ===========================================================================
	
	/**
	 * 验证字符串是否是由数字或英文字母组成
	 * @param value 待验证字符串
	 * @return boolean 符合规范ture, 不符合false
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午2:40:59
	 */
	private static boolean validateLetterAndNum(String value){
		Pattern pt = Pattern.compile("^[A-Za-z0-9]+$");
		return pt.matcher(value).matches();
	}
	
	/**
	 * 验证字符串是否是由数字或英文字母组成
	 * @param value 待验证字符串
	 * @param maxLength 最大长度限制
	 * @return boolean 符合规范ture, 不符合false
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午2:42:36
	 */
	private static boolean validateLetterAndNum(String value, int maxLength){
		if(validateStrByLength(value,maxLength)){
			return validateLetterAndNum(value);
		}
		return false;
	}
	
	/**
	 * 验证字符串是否是由数字或英文字母组成
	 * @param value 待验证字符串
	 * @param maxLength 最大长度限制
	 * @param allowNull 是否允许为空，允许true, 不允许false
	 * @return boolean 符合规范ture, 不符合false
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午2:44:07
	 */
	public static boolean validateLetterAndNum(String value, int maxLength, boolean allowNull){
		if(StringUtils.isBlank(value)){
			if(!allowNull){
				return false;
			}
			return true;
		}
		return validateLetterAndNum(value, maxLength);
	}

	// ===========================================================================
	
	/**
	 * 验证字符串是否为固定长度数字组成
	 * @param code 待验证字符串
	 * @param limitLength 固定长度限制
	 * @return boolean 符合规范ture, 不符合false  
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午2:53:44
	 */
	private static boolean validateFixedLengthNumber(String code, int limitLength){
		Pattern ptNo = Pattern.compile("[0-9]{"+limitLength+"}");
		return ptNo.matcher(code).matches();
	}
	
	/**
	 * 验证字符串是否为固定长度数字组成
	 * @param code 待验证字符串
	 * @param limitLength 固定长度限制
	 * @param allowNull 是否允许为空，允许true, 不允许false
	 * @return boolean 符合规范ture, 不符合false  
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午2:54:31
	 */
	public static boolean validateFixedLengthNumber(String code, int limitLength, boolean allowNull){
		if(StringUtils.isBlank(code)){
			if(!allowNull){
				return false;
			}
			return true;
		}else{
			return validateFixedLengthNumber(code, limitLength);
		}
	}
	
	/**
	 * 验证Integer是否为固定长度数字组成
	 * @param code 待验证Integer
	 * @param limitLength 固定长度限制
	 * @param allowNull 是否允许为空，允许true, 不允许false
	 * @return boolean 符合规范ture, 不符合false  
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午2:55:06
	 */
	public static boolean validateFixedLengthNumber(Integer code, int limitLength, boolean allowNull){
		if(code != null){
			return validateFixedLengthNumber(code+"", limitLength);
		}else{
			if(!allowNull){
				return false;
			}
			return true;
		}
	}
	
	// ===========================================================================
	
	/**
	 * 校验字符串是否是数字
	 * @param value 待校验的字符串
	 * @param maxLength 允许的最大长度
	 * @return boolean 符合规范ture, 不符合false    
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:37:19
	 */
	private static boolean validateNumber(String value,int maxLength){
		Pattern ptNumber = Pattern.compile("^[0-9]\\d{0,"+(maxLength-1)+"}$");
		return ptNumber.matcher(value).matches();
	}
	
	/**
	 * 校验字符串是否是数字
	 * @param value 待校验的字符串
	 * @param maxLength 允许的最大长度
	 * @param allowNull 是否允许为空，允许true, 不允许false
	 * @return boolean 符合规范ture, 不符合false  
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:36:00
	 */
	public static boolean validateNumber(String value, int maxLength, boolean allowNull){
		if(StringUtils.isBlank(value)){
			if(!allowNull){
				return false;
			}
			return true;
		}
		return validateNumber(value, maxLength);
	}
	
	/**
	 * 验证首位不为0且最大长度为maxLength的数字
	 * @param value 待校验的字符串
	 * @param maxLength 允许的最大长度
	 * @return boolean 符合规范ture, 不符合false   
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月4日 下午8:26:32
	 */
	private static boolean validateFirstNotZeroNumber(String value,int maxLength){
		Pattern ptNumber = Pattern.compile("^[1-9]\\d{0,"+(maxLength-1)+"}$");
		return ptNumber.matcher(value).matches();
	}
	
	/**
	 * 验证首位不为0且最大长度为maxLength的数字
	 * @param value 待校验的字符串
	 * @param maxLength 允许的最大长度
	 * @param allowNull 是否允许为空，允许true, 不允许false 
	 * @return boolean 符合规范ture, 不符合false   
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:40:33
	 */
	public static boolean validateFirstNotZeroNumber(String value,int maxLength, boolean allowNull){
		if(StringUtils.isBlank(value)){
			if(!allowNull){
				return false;
			}
			return true;
		}
		return validateFirstNotZeroNumber(value, maxLength);
	}
	
	
	// ===========================================================================
	
	/**
	 * 验证字符串是否为32位UUID
	 * @param uuid 待验证字符串
	 * @return boolean 符合规范ture, 不符合false
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午2:47:06
	 */
	private static boolean validateUUID(String uuid){
		Pattern ptUUID = Pattern.compile("[a-zA-Z0-9]{32,32}");
		return ptUUID.matcher(uuid).matches();
	}
	
	/**
	 * 验证字符串是否为32位UUID
	 * @param uuid 待验证字符串
	 * @param allowNull 是否允许为空，允许true, 不允许false
	 * @return boolean 符合规范ture, 不符合false  
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午2:47:42
	 */
	public static boolean validateUUID(String uuid, boolean allowNull){
		if(StringUtils.isBlank(uuid)){
			if(!allowNull){
				return false;
			}
			return true;
		}else{
			return validateUUID(uuid);
		}
	}

	
	/**
	 * 校验手机号 1开头的11位数字
	 * @param phone 需要验证的字符串
	 * @return   boolean 符合格式true 不符合false
	 * @author:	azzcsimp
	 * @Createdate:	2014年12月31日 下午1:29:18
	 */
	private static boolean validatePhone(String phone){
		Pattern ptPhone = Pattern.compile("^1\\d{10}$");
		return ptPhone.matcher(phone).matches();
	}
	
	/**
	 * 校验手机号格式是否正确
	 * @param phone 需要验证的字符串
	 * @param allowNull 是否允许为空，允许true,不允许false 
	 * @return boolean 符合格式true 不符合false  
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:00:11
	 */
	public static boolean validatePhone(String phone, boolean allowNull){
		if(StringUtils.isBlank(phone)){
			if(!allowNull){
				return false;
			}
			return true;
		}else{
			return validatePhone(phone);
		}
	}

	/**
	 * 校验yyy-MM-dd格式日期
	 * @param date 待校验字符串
	 * @return boolean 符合格式true 不符合false    
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:02:04
	 */
	private static boolean validateDateYYYYMMDD(String date){
		Pattern ptDate = Pattern.compile("^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$");
		return ptDate.matcher(date).matches();
	}
	
	/**
	 * 校验yyy-MM-dd格式日期
	 * @param date  待校验字符串
	 * @param allowNull 是否允许为空，允许true,不允许false 
	 * @return boolean 符合格式true 不符合false      
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:10:15
	 */
	public static boolean validateDateYYYYMMDD(String date, boolean allowNull){
		if(StringUtils.isBlank(date)){
			if(!allowNull){
				return false;
			}
			return true;
		}else{
			return validateDateYYYYMMDD(date);
		}
	}

	/**
	 * 校验套餐类型 允许值(A、B、C、D)
	 * @param type 待校验字符串
	 * @return boolean 符合格式true 不符合false        
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:13:47
	 */
	private static boolean validatePriceType(String type){
		if(type.equals("A") || type.equals("B") || type.equals("C") || type.equals("D")){
			return true;
		}
		return false;
	}
	
	/**
	 * 校验套餐类型 允许值(A、B、C、D)
	 * @param type 待校验字符串
	 * @param allowNull 是否允许为空，允许true,不允许false 
	 * @return boolean 符合格式true 不符合false          
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:14:36
	 */
	public static boolean validatePriceType(String type, boolean allowNull){
		if(StringUtils.isBlank(type)){
			if(!allowNull){
				return false;
			}
			return true;
		}else{
			return validatePriceType(type);
		}
	}
	
	/**
	 * 校验IP格式
	 * @param value 待校验字符串
	 * @return boolean 符合格式true 不符合false            
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:17:30
	 */
	private static boolean validateIP(String value){
		Pattern ptIP = Pattern.compile("^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$");
		return ptIP.matcher(value).matches();
	}
	
	/**
	 * 校验IP格式
	 * @param value 待校验字符串
	 * @param allowNull 是否允许为空，允许true,不允许false 
	 * @return  boolean 符合格式true 不符合false          
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:19:11
	 */
	public static boolean validateIP(String value, boolean allowNull){
		if(StringUtils.isBlank(value)){
			if(!allowNull){
				return false;
			}
			return true;
		}else{
			return validateIP(value);
		}
	}
	
	/**
	 * 校验电子邮件格式
	 * @param value 待校验字符串
	 * @return boolean 符合格式true 不符合false      
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:21:47
	 */
	private static boolean validateEmail(String value){
		Pattern ptEmail = Pattern.compile("^[A-Za-z0-9._%'-]+@[A-Za-z0-9.-]+\\.[a-zA-Z]{2,4}$");
		return ptEmail.matcher(value).matches();
	}

	/**
	 * 校验电子邮件格式
	 * @param value 待校验字符串
	 * @param allowNull 是否允许为空，允许true,不允许false 
	 * @return boolean 符合格式true 不符合false    
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:22:24
	 */
	public static boolean validateEmail(String value, boolean allowNull){
		if(StringUtils.isBlank(value)){
			if(!allowNull){
				return false;
			}
			return true;
		}else{
			return validateEmail(value);
		}
	}
	
	
	/**
	 * 验证身份证号码
	 * @param value 待校验字符串
	 * @return boolean 符合格式true 不符合false     
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:25:18
	 */
	private static boolean validateIdCardNo(String value){
		Pattern pt = Pattern.compile("^\\d{17}(\\d|x)$");
		return pt.matcher(value).matches();
	}
	
	/**
	 * 验证身份证号码
	 * @param value 待校验字符串
	 * @param allowNull 是否允许为空，允许true,不允许false 
	 * @return boolean 符合格式true 不符合false       
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:25:38
	 */
	public static boolean validateIdCardNo(String value, boolean allowNull){
		if(StringUtils.isBlank(value)){
			if(!allowNull){
				return false;
			}
			return true;
		}else{
			return validateIdCardNo(value);
		}
	}
	
	/**
	 * 校验班级名称格式
	 * @param value 待校验字符串
	 * @return boolean 符合格式true 不符合false     
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:26:45
	 */
	private static boolean validateClassName(String value){
		Pattern pt = Pattern.compile("^([0-9]{1,2})(\\-)([0-9]{1,2})$");
		return pt.matcher(value).matches();
		
	}
	
	/**
	 * 校验班级名称格式
	 * @param value 待校验字符串
	 * @param allowNull 是否允许为空，允许true,不允许false 
	 * @return boolean 符合格式true 不符合false       
	 * @author:	azzcsimp
	 * @Createdate:	2015年1月8日 下午3:27:04
	 */
	public static boolean validateClassName(String value, boolean allowNull){
		if(StringUtils.isBlank(value)){
			if(!allowNull){
				return false;
			}
			return true;
		}else{
			return validateClassName(value);
		}
		
	}
	
	public static boolean isDouble(String value){
		try{
			Double.parseDouble(value);
			return true;
		} catch(NumberFormatException ex){
			return false;
		}
	}
	
	public static boolean validateNumberRange(Integer value,int minNum,int maxNum,boolean allowNull){
		if(null == value){
			if(!allowNull){
				return false;
			}else{
				return true;
			}
		}else{
			return (value >= minNum && value <= maxNum);
		}
	}
	
}

